<?php
class JSSDK {
  	private $appId;
  	private $appSecret;
	private $root;
	//构造函数
  	public function __construct() {
  		//$this->appId = "wxe058a8e73715b660";
    	//$this->appSecret = "4f7bc13499a39cb0a9a433df2fa1985f";
    	$this->appId = "wx8ad440a19b0a4556";
    	$this->appSecret = "a85a374841318ee15237e647f6548dff";
    	$this->root = $_SERVER['DOCUMENT_ROOT']."/wx_test/";
  	}

	//获取签名
  	public function getSignPackage() {
    	$jsapiTicket = $this->getJsApiTicket();
    	//注意 URL 一定要动态获取，不能 hardcode.
    	$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    	$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    	$timestamp = time();
    	$nonceStr = $this->createNonceStr();

    	//这里参数的顺序要按照 key 值 ASCII 码升序排序
    	$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

    	$signature = sha1($string);

	    $signPackage = array(
	      	"appId"     => $this->appId,
	      	"nonceStr"  => $nonceStr,
	      	"timestamp" => $timestamp,
	      	"url"       => $url,
	      	"signature" => $signature,
	      	"rawString" => $string
	    );
	    return $signPackage;
	}

	//生成随机字符串
  	private function createNonceStr($length = 16) {
    	$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    	$str = "";
    	for ($i = 0; $i < $length; $i++) {
      	$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    	}
    	return $str;
  	}


	//获取ticket
  	private function getJsApiTicket() {
	    //jsapi_ticket 应该全局存储与更新
	    $data = json_decode($this->get_php_file($this->root."jsapi_ticket.php"),TRUE);
		//$this->wxlog($data,__FILE__,__LINE__);
	    if ($data["expire_time"] < time()) {
	      	$accessToken = $this->getAccessToken();
	      	$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=".$accessToken;
	      	$res = json_decode($this->httpGet($url));
	      	$ticket = $res->ticket;
			//$this->wxlog($ticket,__FILE__,__LINE__);
	      	if ($ticket) {
	        	$data["expire_time"] = time() + 7000;
	        	$data["jsapi_ticket"] = $ticket;
	        	$this->set_php_file($this->root."jsapi_ticket.php", json_encode($data));
	      	}
	    } else {
	      	$ticket = $data["jsapi_ticket"];
			//$this->wxlog($ticket,__FILE__,__LINE__);
	    }
	    return $ticket;
	}

	//获取token
  	public function getAccessToken() {
    	//access_token 应该全局存储与更新
    	$data = json_decode($this->get_php_file($this->root.'access_token.php'),TRUE);
		$this->wxlog($data,__FILE__,__LINE__);
    	if ($data["expire_time"] < time()) {
	      	$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appId."&secret=".$this->appSecret;
	      	$res = json_decode($this->httpGet($url));
	      	$access_token = $res->access_token;

			$this->wxlog($access_token,__FILE__,__LINE__);
	      	if ($access_token) {
	        	$data["expire_time"] = time() + 7000;
	        	$data["access_token"] = $access_token;
	        	$this->set_php_file($this->root.'access_token.php', json_encode($data));
	      	}
	    } else {
	      	$access_token = $data["access_token"];
			$this->wxlog($access_token,__FILE__,__LINE__);
	    }
	    return $access_token;
	}

  	private function httpGet($url) {
    	$curl = curl_init();
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//设置不输出
    	curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    	//为保证第三方服务器与微信服务器之间数据传输的安全性，所有微信接口采用https方式调用，必须使用下面2行代码打开ssl安全校验。
    	//如果在部署过程中代码在此处验证失败，请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
    	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);//服务端校验
    	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);//不执行严格校验
    	curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);//SSL版本
    	curl_setopt($curl, CURLOPT_URL, $url);

    	$res = curl_exec($curl);
    	curl_close($curl);
		return $res;
  	}

  	private function get_php_file($filename) {
    	return trim(substr(file_get_contents($filename), 15));
  	}
  	private function set_php_file($filename, $content) {
    	$fp = fopen($filename, "w");
    	fwrite($fp, "<?php exit();?>" . $content);
    	fclose($fp);
  	}


	//打印日志
	private function wxlog($arr,$file,$line){
		if(is_array($arr)){
			$log = $arr;
		}else{
			$log["value"] = $arr;
		}
		$content = "File => ".end(explode('\\',$file))." on line:".$line."\r\n";
		$content .= date("Y/m/d H:i:s")." array(";

		foreach ($log as $key => $value) {
			if(is_array($value)){
				$content .= "\r\n    '".$key."' => '".urldecode(json_encode($value))."'";
			}else{
				$content .= "\r\n    '".$key."' => '".$value."'";
			}
		}
		$content .= "\r\n)\r\n\r\n";
        $log_filename = $this->root."log/".date("Ymd").".log";
        if(file_exists($log_filename)){
			file_put_contents($log_filename, $content ,FILE_APPEND);
        }else{
        	file_put_contents($log_filename, $content);
        }
	}
}

